19542
13991
Αυτή η ερώτηση έχει ήδη απαντήσεις εδώ:
Καμία σιωπηρή μετατροπή σε υπερφορτωμένο χειριστή
(2 απαντήσεις)
Κλειστό πριν από 7 χρόνια.
Γράφω ένα απλό περιτύλιγμα για έναν στοιχειώδη τύπο και προσπαθώ να αποφύγω να χρειαστεί να γράψω πάρα πολλές γεύσεις τυπικών χειριστών. Ήλπιζα ότι η σιωπηρή μετατροπή τύπου θα βοηθούσε, αλλά όχι. Ακολουθεί ένα παράδειγμα:
δομή Int
{
int _i;
Int (int i = 0): _i {i} {}
Διαχειριστής + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(άκυρο) (Int (1) + 2) // Πρόστιμο
(άκυρο) (2 + Int (1)); // σφάλμα: μη έγκυροι τελεστές στη δυαδική έκφραση («int» και «Int»)
}
Χρησιμοποιώ το llvm. Η πρώτη γραμμή των βασικών συλλογών είναι μια χαρά. Το δεύτερο προκαλεί σφάλμα. Τώρα, αυτό που ήλπιζα ότι θα συμβεί στη δεύτερη γραμμή είναι ότι το 2 θα μετατραπεί σιωπηρά σε Int (2), ακολουθούμενο από μια κλήση στον χειριστή +. Γιατί δεν συμβαίνει αυτό; Γιατί συμβαίνει η σιωπηρή μετατροπή στην πρώτη γραμμή; 
Συμβαίνει στην πρώτη γραμμή επειδή ο μόνος τελεστής + διαθέσιμος είναι ο τελεστής + (Int &) (ο οποίος έχει μια σιωπηρή πρώτη παράμετρο Int για αυτήν την περίπτωση). Η δεύτερη γραμμή αποτυγχάνει επειδή η πρώτη παράμετρος είναι int και δεν έχει καμία ένδειξη ότι πρέπει να τη μετατρέψει πριν επιχειρήσει τη λειτουργία (δεν γνωρίζει ότι πρέπει να χρησιμοποιήσει το Int :: operator +).
Μπορείτε να αποφύγετε αυτό το πρόβλημα κάνοντας τον χειριστή μια λειτουργία φίλου που δεν είναι μέλος (http://ideone.com/YCf7wX)
δομή Int
{
int _i;
Int (int i = 0): _i {i} {}
φίλος Int χειριστής + (const Int & lhs, const Int & rhs);
};
Διαχειριστής + (const Int & lhs, const Int & rhs)
{
επιστροφή lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
επιστροφή 0;
}
|
Δεν είναι η απάντηση που ψάχνετε; Περιηγηθείτε σε άλλες ερωτήσεις με ετικέτα c ++ τελεστής-λέξη-κλειδί σιωπηρή μετατροπή ή κάντε τη δική σας ερώτηση.